package reference;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

public class TestMain {
	public static void main(String[] args) {
		// teststrong();
		// testsoft();
		//testweak();
		testphantom();
	}

	// 强引用设置null自动回收
	public static void testauto() {
		MyDate date = new MyDate();
		date = null;
		// 隐式回收,增大开销使jvm自动回收
		ReferenceTest.drainMemory();
		// 显式回收
		// System.gc();
		System.out.println("end");
	}

	// 强引用不回收
	public static void teststrong() {
		MyDate date = new MyDate();
		// 显示回收
		System.gc();
		System.out.println("end");
	}

	// 软引用,我的内存太大了，测试不出来效果，需要设置jvm内存小一点，必须在内存不多时才会释放
	public static void testsoft() {
		SoftReference ref = new SoftReference(new MyDate());
		//
		// ReferenceTest.drainMemory();
		//
	}

	//弱引用也是在运行一段时间后系统才去回收,或者自己去clear也会被回收，不过clear需要自己管理了
	//这个运行结果不固定,多次gc后就一定会被回收了
	public static void testweak() {
		WeakReference ref = new WeakReference(new MyDate());
		// ref.clear();
		//ReferenceTest.drainMemory();
		System.gc();
		System.gc();
	}

	//虚引用,多次gc后就一定会被回收了
	public static void testphantom() {
		ReferenceQueue queue = new ReferenceQueue();
		PhantomReference ref = new PhantomReference(new MyDate(), queue);
		System.out.println("---");
		System.gc();
		System.gc();
		System.gc();
	}
}
